import {
  validatenull
} from './validate'
import request from '../router/axios'
import * as CryptoJS from 'crypto-js'
import store from '../store'
import {
  Message
} from 'element-ui'
import i18n from '../lang'
import {
  getStore,
  setStore
} from './store'
import { getLang } from '../api/admin/dict'
// 表单序列化
export const serialize = data => {
  const list = []
  Object.keys(data).forEach(ele => {
    list.push(`${ele}=${data[ele]}`)
  })
  return list.join('&')
}
export const getObjType = obj => {
  var toString = Object.prototype.toString
  var map = {
    '[object Boolean]': 'boolean',
    '[object Number]': 'number',
    '[object String]': 'string',
    '[object Function]': 'function',
    '[object Array]': 'array',
    '[object Date]': 'date',
    '[object RegExp]': 'regExp',
    '[object Undefined]': 'undefined',
    '[object Null]': 'null',
    '[object Object]': 'object'
  }
  if (obj instanceof Element) {
    return 'element'
  }
  return map[toString.call(obj)]
}
/**
 * 对象深拷贝
 */
export const deepClone = data => {
  var type = getObjType(data)
  var obj
  if (type === 'array') {
    obj = []
  } else if (type === 'object') {
    obj = {}
  } else {
    // 不再具有下一层次
    return data
  }
  if (type === 'array') {
    for (var i = 0, len = data.length; i < len; i++) {
      obj.push(deepClone(data[i]))
    }
  } else if (type === 'object') {
    for (var key in data) {
      obj[key] = deepClone(data[key])
    }
  }
  return obj
}
/**
 * 判断路由是否相等
 */
export const diff = (obj1, obj2) => {
  delete obj1.close
  var o1 = obj1 instanceof Object
  var o2 = obj2 instanceof Object
  if (!o1 || !o2) {
    /*  判断不是对象  */
    return obj1 === obj2
  }

  if (Object.keys(obj1).length !== Object.keys(obj2).length) {
    return false
    // Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如：数组返回下表：let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2;
  }

  for (var attr in obj1) {
    var t1 = obj1[attr] instanceof Object
    var t2 = obj2[attr] instanceof Object
    if (t1 && t2) {
      return diff(obj1[attr], obj2[attr])
    } else if (obj1[attr] !== obj2[attr]) {
      return false
    }
  }
  return true
}
/**
 * 设置灰度模式
 */
export const toggleGrayMode = (status) => {
  if (status) {
    document.body.className = document.body.className + ' grayMode'
  } else {
    document.body.className = document.body.className.replace(' grayMode', '')
  }
}
/**
 * 设置主题
 */
export const setTheme = (name) => {
  document.body.className = name
}

/**
 *加密处理
 */
export const encryption = (params) => {
  let {
    data,
    type,
    param,
    key
  } = params
  const result = JSON.parse(JSON.stringify(data))
  if (type === 'Base64') {
    param.forEach(ele => {
      result[ele] = btoa(result[ele])
    })
  } else {
    param.forEach(ele => {
      var data = result[ele]
      key = CryptoJS.enc.Latin1.parse(key)
      var iv = key
      // 加密
      var encrypted = CryptoJS.AES.encrypt(
        data,
        key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.ZeroPadding
      })
      result[ele] = encrypted.toString()
    })
  }
  return result
}

/**
 * 浏览器判断是否全屏
 */
export const fullscreenToggel = () => {
  if (fullscreenEnable()) {
    exitFullScreen()
  } else {
    reqFullScreen()
  }
}
/**
 * esc监听全屏
 */
export const listenfullscreen = (callback) => {
  function listen() {
    callback()
  }

  document.addEventListener('fullscreenchange', function () {
    listen()
  })
  document.addEventListener('mozfullscreenchange', function () {
    listen()
  })
  document.addEventListener('webkitfullscreenchange', function () {
    listen()
  })
  document.addEventListener('msfullscreenchange', function () {
    listen()
  })
}
/**
 * 浏览器判断是否全屏
 */
export const fullscreenEnable = () => {
  return document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen
}

/**
 * 浏览器全屏
 */
export const reqFullScreen = () => {
  if (document.documentElement.requestFullScreen) {
    document.documentElement.requestFullScreen()
  } else if (document.documentElement.webkitRequestFullScreen) {
    document.documentElement.webkitRequestFullScreen()
  } else if (document.documentElement.mozRequestFullScreen) {
    document.documentElement.mozRequestFullScreen()
  }
}
/**
 * 浏览器退出全屏
 */
export const exitFullScreen = () => {
  if (document.documentElement.requestFullScreen) {
    document.exitFullScreen()
  } else if (document.documentElement.webkitRequestFullScreen) {
    document.webkitCancelFullScreen()
  } else if (document.documentElement.mozRequestFullScreen) {
    document.mozCancelFullScreen()
  }
}
/**
 * 递归寻找子类的父类
 */

export const findParent = (menu, id) => {
  for (let i = 0; i < menu.length; i++) {
    if (menu[i].children.length !== 0) {
      for (let j = 0; j < menu[i].children.length; j++) {
        if (menu[i].children[j].id === id) {
          return menu[i]
        } else {
          if (menu[i].children[j].children.length !== 0) {
            return findParent(menu[i].children[j].children, id)
          }
        }
      }
    }
  }
}

/**
 * 动态插入css
 */

export const loadStyle = url => {
  const link = document.createElement('link')
  link.type = 'text/css'
  link.rel = 'stylesheet'
  link.href = url
  const head = document.getElementsByTagName('head')[0]
  head.appendChild(link)
}
/**
 * 动态插入js
 */

export const loadJs = url => {
  const script = document.createElement('script')
  script.src = url
  const head = document.getElementsByTagName('head')[0]
  head.appendChild(script)
}
/**
 * 判断路由是否相等
 */
export const isObjectValueEqual = (a, b) => {
  let result = true
  Object.keys(a).forEach(ele => {
    const type = typeof (a[ele])
    if (type === 'string' && a[ele] !== b[ele]) result = false
    else if (type === 'object' && JSON.stringify(a[ele]) !== JSON.stringify(b[ele])) result = false
  })
  return result
}
/**
 * 根据字典的value显示label
 */
export const findByvalue = (dic, value) => {
  let result = ''
  if (validatenull(dic)) return value
  if (typeof (value) === 'string' || typeof (value) === 'number' || typeof (value) === 'boolean') {
    let index = 0
    index = findArray(dic, value)
    if (index !== -1) {
      result = dic[index].label
    } else {
      result = value
    }
  } else if (value instanceof Array) {
    result = []
    let index = 0
    value.forEach(ele => {
      index = findArray(dic, ele)
      if (index !== -1) {
        result.push(dic[index].label)
      } else {
        result.push(value)
      }
    })
    result = result.toString()
  }
  return result
}
/**
 * 根据字典的value查找对应的index
 */
export const findArray = (dic, value) => {
  for (let i = 0; i < dic.length; i++) {
    if (dic[i].value === value) {
      return i
    }
  }
  return -1
}
/**
 * 生成随机len位数字
 */
export const randomLenNum = (len, date) => {
  let random = ''
  random = Math.ceil(Math.random() * 100000000000000).toString().substr(0, len || 4)
  if (date) random = random + Date.now()
  return random
}
/**
 * 打开小窗口
 */
export const openWindow = (url, title, w, h) => {
  // Fixes dual-screen position                            Most browsers       Firefox
  const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left
  const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top

  const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width
  const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height

  const left = ((width / 2) - (w / 2)) + dualScreenLeft
  const top = ((height / 2) - (h / 2)) + dualScreenTop
  const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left)

  // Puts focus on the newWindow
  if (window.focus) {
    newWindow.focus()
  }
}

/**
 * 跨域组件直接打开使用
 * @param {*} router 
 * @param {*} url 
 */
export const getPlatformComponentsPath = (router, url) => {
  getLang('/admin').then(res => {
    router.push({
      path: `/c-page/urlPath?${objToform({ src: url })}`
    })
  }).catch(err => {
    location.reload()
  })
}

const objToform = (obj) => {
  const result = []
  Object.keys(obj).forEach(ele => {
    result.push(`${ele}=${obj[ele]}`)
  })
  return result.join('&')
}

/**
 * 打开其他系统的model
 * @param {*} url model地址
 * @param {*} isSystem 是否是动态路由
 * @param {*} prefix 非动态路由前缀
 * @param {*} iframe 是否启用ifame
 */
export const openPlatformWindow = (url, isSystem = true, prefix = false, iframe) => {
  if (!url) {
    console.error('请输入模块地址');
    return
  }
  let params = ''
  if (url.indexOf('?') !== -1) {
    const i = url.split('?')
    url = i[0]
    params = i[1]
  }
  if (!isSystem) {
    if (prefix !== false) {
      if (iframe) return window.origin + (prefix === '/admin' ? '' : prefix) + '/#' + url + (params ? `?${params}` : '')
      else window.open(window.origin + (prefix === '/admin' ? '' : prefix) + '/#' + url + (params ? `?${params}` : ''))
    } else console.error('请输入系统前缀 --- example /admin')
    return
  }
  const appId = getUrl(url)
  let result = ''
  if (appId) {
    store.getters.module.some(res => {
      if (res.id === appId) {
        if (iframe) result = res.frontHostUrl + '#' + url + (params ? `?${params}` : '')
        else window.open(res.frontHostUrl + '#' + url + (params ? `?${params}` : ''))
        return true
      }
    })
    if (iframe) return result
  } else {
    Message.warning(i18n.messages[i18n.locale].noModel)
  }
}
export const getUrl = (url, list = store.getters.menu, result = false) => {
  if (Array.isArray(list))
    list.some(res => {
      if (res.path === url) {
        result = res.appId
        return true
      }
      if (res.children.length > 0) result = getUrl(url, res.children, result)
    })
  return result
}

/**
 *  <img> <a> src 处理
 * @returns {PromiseLike<T | never> | Promise<T | never>}
 */
export function handleImg(fileName, id) {
  return validatenull(fileName) ? null : request({
    url: '/admin/sys-file/preview/' + fileName,
    method: 'get',
    responseType: 'blob'
  }).then((response) => { // 处理返回的文件流
    const blob = response.data
    const img = document.getElementById(id)
    img.src = URL.createObjectURL(blob)
    window.setTimeout(function () {
      window.URL.revokeObjectURL(blob)
    }, 0)
  })
}

export function handleDown(filename, bucket) {
  return request({
    url: '/admin/sys-file/' + bucket + '-' + filename,
    method: 'get',
    responseType: 'blob'
  }).then((response) => { // 处理返回的文件流
    const blob = response.data
    const link = document.createElement('a')
    link.href = URL.createObjectURL(blob)
    link.download = filename
    document.body.appendChild(link)
    link.click()
    window.setTimeout(function () {
      URL.revokeObjectURL(blob)
      document.body.removeChild(link)
    }, 0)
  })
}

export function getQueryString(url, paraName) {
  const arrObj = url.split('?')
  if (arrObj.length > 1) {
    const arrPara = arrObj[1].split('&')
    let arr
    for (let i = 0; i < arrPara.length; i++) {
      arr = arrPara[i].split('=')
      // eslint-disable-next-line eqeqeq
      if (arr != null && arr[0] == paraName) {
        return arr[1]
      }
    }
    return ''
  } else {
    return ''
  }
}

/**
 * 获取浏览器默认语言
 */
export const getWebLanguage = () => {
  if (getStore({
    name: 'language'
  })) return getStore({
    name: 'language'
  })
  let language = 'zh_CN'
  switch (navigator.language || navigator.userLanguage) {
    case 'zh-CN':
    case 'zh':
      language = 'zh_CN'
      break;
    case 'en':
    case 'en-CA':
    case 'en-IN':
    case 'en-NZ':
    case 'en-ZA':
    case 'en-GB':
    case 'en-US':
    case 'en-AU':
      language = 'en_US'
  }
  setStore({
    name: 'language',
    content: language
  })
  return language
}

/**
 * 数组转对象
 */

export const getObjByArray = (array, key = 'pkey', value = 'value') => {
  const result = {}
  array.some(res => {
    result[res[key]] = res[value]
  })
  return result
}

/**
 * 系统常量
 */

export const tableNameMapping = {
  SYS_USER: 'sys_user', // 用户
  SYS_EMP_BASE: 'sys_emp_base', // 员工
  SYS_POSITION: 'sys_position', // 职位
  CRM_CUSTOMER_BASE: 'crm_customer_base', // 客户
  SYS_DEPT_: 'sys_dept', //部门
  SYS_ORG: 'sys_org', // 组织
  CRM_MARKET_ACTIVITY: 'crm_market_activity', // 市场活动
  CRM_CUSTOMER_FOLLOW: 'crm_customer_follow', // 跟进记录
  CRM_PRODUCT: 'crm_product', // CRM产品
  CRM_REFUND: 'crm_refund', //退款申请
  CRM_RETURN_VISIT: 'crm_return_visit', //回访记录
  CRM_CUSTOM: 'crm_custom', // crm-sks客户
  CRM_CONTACTS: 'crm_contacts', // crm-sks联系人
  CRM_BUSINESS_OPPORTUNITY: 'crm_business_opportunity', // crm-sks业务机会
  CRM_CONTRACT: 'crm_contract', // crm-sks合同
}


export const sysExpression = [{
  label: '当前时间',
  value: '%currentTime%'
}, {
  label: '当前操作者',
  value: '%currentUser%'
}, {
  label: '当前操作者组织',
  value: '%currentUserOrg%'
}, {
  label: '当前操作者部门',
  value: '%currentUserDept%'
}, {
  label: '当前操作者职位',
  value: '%currentUserPos%'
}]
